package cn.jbolt.common.base;

import java.util.Map;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;
import com.jfinal.core.Controller;
import com.jfinal.kit.JsonKit;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;

import cn.jbolt.common.util.AESUtils;

/**
 * Controller基类，基于JFinal核心Controller，扩展参数获取，返回值加密处理方法
 * @author 160494
 *
 */
public class BaseController extends Controller {
    private static final Logger logger = LoggerFactory.getLogger(BaseController.class);
    private Prop p= PropKit.use("config.properties");
    /**
     * 用于加密接口返回的数据，数据按接口协议封装好以后再目标controller调用该方法即可加密返回给调用方
     * @param obj
     */
    public void renderToEncriptedText(Object obj){
         logger.debug("\n result ={} ,\n decript ={}\n",AESUtils.encrypt(JsonKit.toJson(obj),p.get("AES_CIPHER_CODE")),JsonKit.toJson(obj));
         renderText(AESUtils.encrypt(JsonKit.toJson(obj),p.get("AES_CIPHER_CODE")));
    }

    /**
     * 改良的获取所有参数的方法
     * 目的在于使用精确解析参数值，使用getParaMap()得到的参数的值全部为数组形式，哪怕只有一个值也是如此
     * 该方法会将不同的name属性对应的值进行解析，根据数量转化为单个值或者数组对象，或者null
     * @return JSONObject所包含的接口完整参数集合
     */
    public JSONObject getAllParams(){
       JSONObject result=getAttr("params");
       if(result!=null){
           return result;
       }
        result=new JSONObject();
        Map<String,String[]> map=getParaMap();
        //String params= JsonKit.toJson(map);
        Set<String> keySet=map.keySet();
        for(String key:keySet){
            if(map.get(key) instanceof String[]){
                String[] value=map.get(key);
                if(value.length==0){
                    result.put(key,null);

                }else if(value.length==1){
                    result.put(key,value[0]);
                }else{
                    result.put(key,value);
                }
            }else{
                result.put(key,map.get(key));
            }
        }
        return result;
    }

}
